package thread;

import java.util.concurrent.*;

/**
 * 线程池基本应用
 */
public class ThreadPoolDemo01 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //1.创建线程池(要求固定大小),这种方式创建的池不灵活,很多参数无法自己指定，简单用可以
        ExecutorService es =
                Executors.newFixedThreadPool(2);//这里的2表示最多2个线程
        System.out.println(es.getClass().getName());
        //2.通过池中的线程去执行任务
        es.execute(()->{
            System.out.println(Thread.currentThread().getName()+": execute task1");
        });
        es.execute(()->{
            System.out.println(Thread.currentThread().getName()+": execute task2");
        });
        es.execute(()->{//Runnable
            System.out.println(Thread.currentThread().getName()+": execute task3");
        });
        //当需要返回值时，用此方法
        Future<Integer> submit = es.submit(()->{//Callable
                System.out.println(Thread.currentThread().getName()+": execute task4");
                Thread.sleep(5000);
                return Integer.valueOf("123456");
            }
       );
        System.out.println(submit.get());//阻塞方法获取任务的执行结果
        //关闭线程池(一般是在服务结束时关闭池)
        es.shutdown();//不再接收新任务，原有任务执行结束则关闭池
        es.shutdownNow();//不再接收新任务,正在执行的任务有可能会被停止。
    }
}
